Módulo:Ficha de persona
local z = {} local argumentos -- Tabla de argumentos con los que se llama a la función local argumento={} -- Argumentos eliminando los argumentos sin datos local Entidad -- Tabla con los datos en Wikidata de la persona. local algunaPropiedadEnlazaWikidata -- Para alguna propiedad no existe la etiqueta ni el enlace mostrándose algo de la forma d:... local datosautoridad={} --inicializa la tabla que genera los cargos para cada autoridad local obtenerDatosWikidata -- true si se deben obtener datos de Wikidata -- Módulos y funciones externas local ModuloFecha = require('Módulo:Fecha') local edad = ModuloFecha.edad local ModuloFicha = require('Módulo:Ficha') local ModuloFormatoTexto = require('Módulo:Formato texto') local enVariasLineas = ModuloFormatoTexto.enVariasLineas local entreParentesis = ModuloFormatoTexto.entreParentesis local ModuloIdentificadores = require('Módulo:Identificadores') local ModuloPaginas = require('Módulo:Páginas') local ModuloWikidataFormatos = require('Módulo:Wikidata/Formatos') local formatoFacebook = ModuloWikidataFormatos.formatoFacebook local formatoTwitter = ModuloWikidataFormatos.formatoTwitter local formatoURL = ModuloWikidataFormatos.formatoURL local formatoPeriodo = ModuloWikidataFormatos.formatoPeriodo local ModuloWikidata = require('Módulo:Wikidata') local lapizWikidata = ModuloWikidata.addLinkback local categorizarWikidata = ModuloWikidata.categorizar local getPropiedadWikidata = ModuloWikidata.getPropiedad local elementoTabla = require('Módulo:Tablas').elemento local enlazarURL = require('Módulo:URL').enlazar local sinBandera = require('Módulo:Bandera').sinBandera -- Constantes local enMayusculas = {'formatoTexto' = 'mayúscula', 'linkback'='sí'} local enMayusculasO = {'formatoTexto' = 'mayúscula', 'conjunción'=' o ', 'linkback'='sí'} local listaNoOrdenada = {'lista' = 'no ordenada', 'linkback'='sí'} --, 'debeExistir' = 'sí' local lugar = {'conjunción'=' o ', 'valor-función' = ModuloWikidataFormatos.formatoLugar, 'linkback'='sí'} local debeExistir = {'debeExistir' = 'sí', 'formatoTexto' = 'mayúscula', 'linkback'='sí'} local conPeriodo = {'lista' = 'no ordenada', 'formatoTexto' = 'mayúscula', 'calificativo' = formatoPeriodo, ordenar='por fecha', 'linkback'='sí'} local conPeriodoDebeExistir = {'lista' = 'no ordenada', 'formatoTexto' = 'mayúscula', 'calificativo' = formatoPeriodo, ordenar='por fecha', 'debeExistir' = 'sí', 'linkback'='sí'} local sinEnlazar = {'enlace'='no', 'linkback'='sí'} local sinLapiz = {} local normal = {'linkback'='sí'} local nombre = '' function fechaiso(x) return x.time end function z.Ficha(frame) ModuloWikidata:setFrame(frame) -- No funciona si se pone ModuloWikidata.setFrame(marco) -- Obtener una copia de los argumentos eliminando los argumentos sin valor -- y dejando en blanco (aunque no nil) aquellos que valen "no" local argumento = obtenerArgumentosConValor(frame) --Determinar si se deben obtener datos de Wikidata if argumento'wikidata' 'no' and (argumentode fallecimiento' or argumentode fallecimiento') then obtenerDatosWikidata = false Entidad = nil else obtenerDatosWikidata = true -- Obtener los datos de la página donde se inserta la ficha de Wikidata. Entidad = mw.wikibase.getEntityObject(argumento'id') or {} end --Determinar datos para la ficha local educacion = argumento'educación' or argumento'educacion' or propiedad('P512',sinEnlazar) local almamater = argumentomáter' or argumento'alma_mater' or argumentomater' or argumento'almamáter' or argumento'alma_máter' or propiedad('P69', { 'formatoTexto' = 'mayúscula', 'lista' = 'no ordenada', 'calificativo' = 'P512','separadorcalificador'=' ', 'linkback'='sí'}) if propiedad('P21', sinLapiz) 'femenino' or propiedad('P21', sinLapiz) 'mujer transgénero' then etiquetaAnyosActivo = 'Años activa' etiquetaConocidoPor = 'Conocida por' etiquetaInfluencias = 'Influida por' etiquetacampeon = 'Campeona del mundo' etiquetaAlumnoDe = 'Alumna de' funcionOcupacion = formatoOcupacionFemenino else etiquetaAnyosActivo = 'Años activo' etiquetaConocidoPor = 'Conocido por' etiquetaInfluencias = 'Influido por' funcionOcupacion = formatoOcupacionMasculino etiquetacampeon = 'Campeón del mundo' etiquetaAlumnoDe = 'Alumno de' end seccionartistica='Carrera artística' --GENERAR CARGOS if argumento'cargo' nil then datosautoridad'cargo1'={tipo='sección',{,''},} else saltoautoridad=' ' datosautoridad'cargo1'=generarcargo(argumento,1,frame) SiHayCargos = true argumento'predecesor'= nil argumento'sucesor'= nil end for i=2, 10 do campovacio=0 if argumento'cargo'..i nil and argumento'inicio'..i nil then datosautoridad'cargo'..i={tipo='sección',{,},} else datosautoridad'cargo'..i=generarcargo(argumento,i,frame) SiHayCargos = true end end -- La ocupación y el área solo se obtienen de Wikidata si no se informan los campos de ocupación y área. -- Esto es porque para los artistas puede tener en Wikidata como ocupación "pintor y escultor" y -- tener informada el área con "pintura y escultura". local ocupacion = argumento'ocupación' or argumento'ocupacion' or argumento'Ocupación' or argumento'profesión' local area = argumento'área' or argumento'area' or argumento'especialidad' or argumento'campos' if not ocupacion and not area then ocupacion = propiedad('P106', {'formatoTexto' = 'mayúscula', 'valor-función'=funcionOcupacion, 'calificativo' = formatoPeriodo, 'linkback'='sí'}) area = propiedad('P101', enMayusculas) -- Campo de trabajo end local ocupacionOArea = ocupacion or area nombre = argumento'nombre' or argumento'Nombre' or obtenerEtiquetaWikidata() or ModuloPaginas.nombrePagina({desambiguar='sí'}) local nombre_completo = argumentocompleto' local nombre_nacimiento = argumentode nacimiento' or propiedad('P1477') local nombre_nacimiento_sin_lapiz = argumentode nacimiento' or propiedad('P1477', sinLapiz) -- Nombre en la escritura nativa. -- Solo se muestra si no coincide con el nombre o el nombre de nacimiento o el nombre completo local nombresNativos={tipo='sección'} local nombreNativo, textoNombreNativo, idiomaNombreNativo if argumentonativo' then if argumentonativo' ~= nombre and argumentonativo' ~= nombre_nacimiento_sin_lapiz and argumentonativo' ~= nombre_completo then table.insert(nombresNativos,{'Nombre nativo', argumentonativo'}) end elseif Entidad then -- En el caso de obtener de Wikidata puede haber varios nombres nativos local declaracion = elementoTabla(Entidad, 'claims','P1559') if declaracion then for k,v in pairs(declaracion) do nombreNativo = elementoTabla(v, 'mainsnak', 'datavalue', 'value') if nombreNativo then textoNombreNativo = nombreNativo.text idiomaNombreNativo = nombreNativo.language if textoNombreNativo and idiomaNombreNativo and textoNombreNativo ~= nombre and textoNombreNativo ~= nombre_nacimiento_sin_lapiz and textoNombreNativo ~= nombre_completo then table.insert(nombresNativos, { 'Nombre en ' .. mw.language.fetchLanguageName(idiomaNombreNativo, 'es') , lapizWikidata(textoNombreNativo,Entidad.id,'P1559') } ) end end end end end -- Informar los datos de nacimiento y de fallecimiento -- Primero se obtiene si la persona ha fallecido local lugarNacimiento = argumentode nacimiento' or propiedad('P19', lugar) local fallecimiento = enVariasLineas({ argumentode fallecimiento' or (obtenerDatosWikidata and entreParentesis(propiedad('P570', enMayusculasO), obtenerEdadWikidata(true))), argumentode fallecimiento' or propiedad('P20', lugar) }) -- Si no se informa el campo "fecha de nacimiento" se obtiene la fecha de nacimiento de -- la propiedad P569 de Wikidata. Si además la persona no ha fallecido se añade entre paréntesis -- la edad. local fechaNacimiento = argumentode nacimiento' if not fechaNacimiento then fechaNacimiento = propiedad('P569', enMayusculasO) if fechaNacimiento and not fallecimiento then fechaNacimiento = entreParentesis(fechaNacimiento, obtenerEdadWikidata()) end end local nacimiento = enVariasLineas({fechaNacimiento, lugarNacimiento}) if argumento'padres' then padres = estaEnlazado(argumento'padres') else padre = propiedad('P22') madre = propiedad('P25') if padre and madre then padres = padre .. ' ' .. madre padre = nil madre = nil end end firma = argumento'firma' or argumento'Firma' or propiedad('P109', {añadir enlace Wikidata' = true}) -- Título según la ocupación y si la persona ha muerto -- No mostrar para los artistas ningún icono en la cabecera de la ficha local contadorocupaciones = 0 --Implementa la lógica de si la persona tiene más de dos ocupaciones la ficha tenga un encabezado estandár if ocupacionOArea then if ocupacionOArea:find('Aactor') or ocupacionOArea:find('Aactriz') or ocupacionOArea:find('Pproductor de cine') or ocupacionOArea:find('Ddirector de cine') then contadorocupaciones=contadorocupaciones+1 tipocabecera = 'cine' estilotitulo = 'background-color:#f9e999' seccionartistica = '' end if contadorocupaciones 0 and (ocupacionOArea:find('Aartista') or ocupacionOArea:find('Ppintor') or ocupacionOArea:find('Eescultor') or ocupacionOArea:find('Ppintura') or ocupacionOArea:find('Eescultura') or ocupacionOArea:find('Ffotograf') or ocupacionOArea:find('Aartes visuales')) then contadorocupaciones=1 tipocabecera = '' estilotitulo = 'background-color:#8DB1C3;color:#FFF' end if contadorocupaciones 0 and (ocupacionOArea:find('Aajedrecista') or argumento'elo' or rankingajedrez) then contadorocupaciones=1 tipocabecera = '' estilotitulo = 'background-color: #D8BFD8' end if contadorocupaciones 0 and (ocupacionOArea:find('Eescritor') or ocupacionOArea:find('Nnovelista') or ocupacionOArea:find('Ppoeta') or ocupacionOArea:find('Ddramaturgo')) then contadorocupaciones=contadorocupaciones+1 tipocabecera = 'libro' estilotitulo = 'background-color:#4c6099;color:#FFF' end if contadorocupaciones 0 and (ocupacionOArea:find('Mmúsico') or ocupacionOArea:find('Ccompositor') or ocupacionOArea:find('Ccantante')) then contadorocupaciones=contadorocupaciones+1 tipocabecera = 'música' estilotitulo = 'background-color:#f0e68c' end --Pendiente por poner el estilo de POLITICO! if contadorocupaciones 0 and (ocupacionOArea:find('Ppolítico') or argumento'cargo') then contadorocupaciones=contadorocupaciones+1 tipocabecera = 'libro' estilotitulo = 'background-color:#4c6099;color:#FFF' end if contadorocupaciones 0 and ocupacionOArea:find('Pperiodista') then contadorocupaciones=contadorocupaciones+1 tipocabecera = 'revista' estilotitulo = 'background-color:#ED8;color:#000' end if contadorocupaciones 0 and ocupacionOArea:find('Ddiseñador') then contadorocupaciones=contadorocupaciones+1 estilotitulo = 'background-color:#ccccff' end if contadorocupaciones 0 and (ocupacionOArea:find('Ppresentador') or ocupacionOArea:find('Cconductor')) then contadorocupaciones=contadorocupaciones+1 tipocabecera = 'cabecera televisión' estilotitulo = 'background-color:#ED8;color:#000' end if contadorocupaciones 0 and ocupacionOArea:find('Mmodelo') then contadorocupaciones=contadorocupaciones+1 tipocabecera = 'hombremujer' estilotitulo = 'background-color:#AF9;color:#000' end end -- El contador de ocupaciones parece valer siempre 0 o 1, por lo que se podría eliminar la variable -- y dejar un if elseif elseif... -- Lo más sencillo es que todas las personas tengan la misma cabecera if contadorocupaciones 2 or contadorocupaciones 0 then tipocabecera = 'humano fn' estilotitulo = 'background-color:#8DB1C3;color:#FFF' end if fallecimiento then estilotitulo = 'background-color:#c0c0c0;color:#000' end estilocabecera = estilotitulo if SiHayCargos true then cargosocupados = '' tipocabecera= nil estilocabecera= 'background-color:transparent;' --estilotitulo ='background-color:#8DB1C3;color:#FFF' estilotitulo ='background-color:#E6E6FA;' else cargosocupados = propiedad('P39', {'lista' = 'no ordenada', 'formatoTexto' = 'mayúscula', ordenar='por fecha', 'linkback'='sí', 'valor-función' = ModuloWikidataFormatos.formatoCargo }) end if argumentoemmy' then eliminaremmmy='Eemmy' end if argumentogrammy' then eliminargrammy='rammy' end if argumentocannes' then eliminarcanes='Cannes' end if argumentoglobo de oro' then eliminarpremio2='Globo'end if argumentotony' then eliminartony='Tony' end if argumentoóscar' then eliminaroscar ='Óscar' end if argumentobafta' then eliminarbafta ='BAFTA' end if argumentosag' then eliminarpremio='indicato'end if argumentosan sebastian' then eliminarsebastian='Sebas'end if argumento'ranking' or argumento'ránking' then rankingajedrez= (argumento'ranking' or argumento'ránking') .. frame:preprocess(' Clasificación FIDE ') end -- Imagen y pie de la imagen local imagen = argumento'imagen' or argumento'Imagen' or argumento'foto' local pieDeImagen if imagen then pieDeImagen = argumentode imagen' or argumento'pieimagen' or argumento'descripción' or argumento'descripcion' or argumentode foto' or argumento'piedefoto' or argumento'textoimagen' or argumento'TextoImagen' or argumento'texto_imagen' or argumentode foto' else imagen, pieDeImagen = obtenerImagenWikidata() -- Pendiente obtener el pie del calificativo P2096 end local Ficha = { wikidata = not obtenerDatosWikidata and 'no', clase = 'biography vcard', -- Título tipocabecera = tipocabecera, titulo = nombre, colorfondo = colorfondo, estilotitulo = estilocabecera, --Imagen --De momento no se pone una raya como en la ficha de escritor tras la imagen imagen = imagen, 'tamañoimagen'= argumentode imagen' or argumento'tamaño' or argumentoimagen' or argumento'tamañoimagen' or argumento'tamañodelaimagen' or argumentode foto' or '220px', -- or '200px' en la ficha de escritor, 192 en la ficha de artista. Tomo por defecto 220, el tamaño de thumb pie = pieDeImagen, -- Pendiente: en la ficha de escritor el texto se pone entre y en la de artista se usa el estilo font-size:smaller --Etiquetas y datos estiloetiqueta = 'width:33%', -- 25% en la ficha de escritor. Sin especificar en la de persona --'padding:0.2em 1.0em 0.2em 0.2em; background-color:transparent; line-height:1.2em;', -- En la ficha de persona original estilodatos = 'padding:0.2em; line-height:1.3em; vertical-align:middle;', {tipo='sección', {, saltoautoridad}, }, datosautoridad'cargo1', datosautoridad'cargo2', datosautoridad'cargo3', datosautoridad'cargo4', datosautoridad'cargo5', datosautoridad'cargo6', datosautoridad'cargo7', datosautoridad'cargo8', datosautoridad'cargo9', datosautoridad'cargo10', {tipo='sección', 'titulo' = 'Información personal', -- Ver la ficha de noble o la ficha de diseñador estilotitulo = estilotitulo, {'Nombre completo', -- solo si no coincide con: (nombre_completo ~= nombre) and -- - el nombre que se muestra en el título de la ficha (nombre_completo ~= nombre_nacimiento_sin_lapiz) and -- - o con el nombre de nacimiento nombre_completo}, {'Nombre de nacimiento', -- solo si no coincide con el nombre que se muestra en el título de la ficha (nombre_nacimiento_sin_lapiz ~= nombre) and nombre_nacimiento}, nombresNativos, {'Apodo', argumento'apodo'}, {'Otros nombres', argumentonombres' or argumento'alias', -- ¿No es lo mismo que el apodo????? clase='nickname'}, {'Nacimiento', nacimiento}, {'Fallecimiento', fallecimiento}, {'Causa de muerte', argumentomuerte' or propiedad('P509', enMayusculas) or propiedad('P1196', enMayusculas)}, -- circunstancias de la muerte {'Lugar de sepultura', argumentode descanso' or propiedad('P119', debeExistir)}, {'Residencia', sinBandera(argumento'residencia' or argumento'país_de_residencia' or argumento'pais_de_residencia' or argumento'lugar_de_residencia') or propiedad('P551'), clase='etiqueta'}, {'Nacionalidad', sinBandera(argumento'nacionalidad' or argumento'Nacionalidad' or argumento'ciudadanías') or --Pendiente hacer que salga el gentilicio propiedad('P27', {'valor-función' = ModuloWikidataFormatos.formatoGentilicio, 'formatoTexto' = 'mayúscula', 'calificativo' = formatoPeriodo, ordenar='por fecha', 'linkback'='sí'}), clase='category'}, {'Ciudadanía', sinBandera(argumento'ciudadanía' or -- ¿No es lo mismo que la nacionalidad? argumento'ciudadania'), clase='category'}, {'Lengua materna', argumento'lengua_materna' or argumento'Lengua_materna' or propiedad('P103', enMayusculas)}, {'Etnia', --propiedad('P172', enMayusculas) or argumento'etnia' or argumentoétnico', clase='category'}, {'Religión', argumento'religión' or propiedad('P140', debeExistir)}, {'Orden religiosa', argumento'congregación' or propiedad('P611', enMayusculas)}, {'Partido político', argumentopolítico' or argumento'partido' or propiedad('P102')}, {'Otras afiliaciones políticas', argumento'afiliaciones' or propiedad('P1416')}, }, {tipo='sección', estilotitulo = estilotitulo, 'titulo' = 'Características físicas', {'Altura', argumento'altura' or argumento'estatura' or propiedad('P2048')}, {'Peso', argumento'peso' or propiedad('P2067')}, {'Medidas', argumento'medidas'}, {'Ojos', argumentode ojos'}, {'Cabello', argumentode cabello'}, {'Pecho natural', argumentonatural'}, --{'Orientación sexual', propiedad('P91', enMayusculas) or argumentosexual' or argumentoreal'} }, {tipo='sección', -- Familia. estilotitulo = estilotitulo, 'titulo' = 'Familia', -- Ver la ficha de noble -- En el caso del cónyuge tiene preferencia el argumento hasta que se muestre los calificativos. clase ='plainlist', -- Mostrar las listas sin viñetas {'Familia nobiliaria', propiedad('P53', debeExistir)}, {(padres and 'Padres') or (padre and 'Padre') or 'Madre', -- Mostrar padres, padre o madre según esté informado ambos o solo uno de ellos padres or padre or madre}, {'Cónyuge', estaEnlazado(argumento'cónyuge' or argumento'conyuge' or argumento'Cónyuge' or argumento'Conyuge' or propiedad('P26', conPeriodo))}, {'Pareja', estaEnlazado(argumento'pareja' or propiedad('P451', conPeriodo))}, {'Hijos', estaEnlazado(argumento'hijos' or argumento'Hijos') or propiedad('P40', {'lista' = 'no ordenada', 'debeExistir' = 'sí', 'linkback'='sí'}) or propiedad('P1971', sinEnlazar) }, {'Familiares', estaEnlazado(argumento'familiares')}, --- ¿¿¿¿¿¿¿¿¿??????????? -- Hermano: P7, padastro: p43, pariente: p1038 }, {tipo='sección', 'titulo' = 'Educación', estilotitulo = estilotitulo, {'Educación', educacion}, {'Alma máter', almamater, clase='plainlist'}, {'Posgrado', argumento'posgrado'}, {'Tesis', entreParentesis( (argumentotesis' and enlazarURL(argumentotesis', ModuloFormatoTexto.enCursivas(argumentotesis'))-- Si se informa la url ) or (not argumentotesis' and ModuloFormatoTexto.enCursivas(argumentotesis') -- Si no se informa la url ) , argumentotesis') }, {'Supervisora doctoral', argumentodoctoral'}, {'Supervisores doctorales' , argumentodoctorales'}, {'Supervisor doctoral' , argumentodoctoral' or propiedad('P184')}, {etiquetaAlumnoDe, argumentode' or propiedad('P1066', conPeriodoDebeExistir), clase='plainlist'}, }, {tipo='sección', 'titulo' = 'Información profesional', estilotitulo = estilotitulo, {'Ocupación', ocupacion, clase='role'}, {'Área', area}, {etiquetaConocidoPor, argumentopor' or argumento'conocido'}, {'Cargos ocupados', cargosocupados,clase='plainlist'}, -- políticos o en empresas {'Empresa', argumento'empresa'}, {'Salario', argumento'salario'}, {'Patrimonio', argumento'patrimonio' or argumento'fortuna'}, {'Tratamiento', argumento'tratamiento'}, {etiquetaAnyosActivo, argumentoactivo' or argumentoactiva' or argumento'añosactivo' or argumento'periodo' or argumento'período' or argumento'Periodo' or argumento'tiempo' or argumento'Tiempo' or formatoPeriodo({ -- falta que salga el lápiz 'P580'={1=elementoTabla(Entidad, 'claims','P2031',1,'mainsnak')}, 'P582'={1=elementoTabla(Entidad, 'claims','P2032',1,'mainsnak')} })}, -- Sección artística (actores y ¿presentadores?) {tipo='sección', 'titulo' = seccionartistica, estilotitulo = estilotitulo, {'Rol debut' , argumentodebut'}, {'Año de debut' , argumentodebut'}, {'Año de retiro', argumentoretiro'}, {'Películas' , argumentode películas'}, {'Serie' , argumento'serie'}, }, {'Empleador', argumento'empleador' or argumento'institución_de_trabajo' or argumento'nombre_estudio' or propiedad('P108', conPeriodo), clase ='plainlist'}, --Profesores {'Estudiantes doctorales', argumentodoctorales' or propiedad('P185', debeExistir)}, {'Estudiantes', argumento'estudiantes' or propiedad('P802', debeExistir)}, {'Restaurantes', argumento'restaurantes'}, -- Para cocineros. Restaurantes en los que ha trabajado. -- Periodistas y presentadores {tipo='sección', {'Medio', argumentode comunicación'}, -- Unas veces informados con el significado de área y otras con el empleador {'Canal', argumento'canal'}, {'Programas', argumento'programas' or argumento'programa'}, }, -- Ocupación (escritores, artistas, periodistas, diseñadores, etc) -- Información artística {tipo='sección', {'Seudónimo', argumento'seudónimo' or argumento'Seudónimo' or propiedad('P742')}, {'Lengua de producción literaria', argumento'lengua_literaria' or argumento'Lengua_literaria'}, {'Género', argumento'género' or argumento'Género' or propiedad('P136', enMayusculas)}, {'Instrumento(s)', argumento'instrumento' or propiedad('P1303', enMayusculas)}, {'Discográfica(s)', argumentodiscográfica' or propiedad('P264', conPeriodo), clase='plainlist'}, {'Movimientos', argumento'movimiento' or argumento'Movimiento' or argumento'movimientos' or propiedad('P135', enMayusculas)}, }, -- Obras notables. Se ponen de momento en cursivas pero es incorrecto en el caso de arquitectos. {'Obras notables', argumentodestacadas' or argumentonotables' or argumento'obras_notables' or argumentonotables' or argumento'obras' or argumento'proyectos_representativos' or propiedad('P800',{'enlace'='sí', 'lista' = 'no ordenada', 'debeExistir' = 'sí', 'formatoTexto'='cursivas', 'linkback'='sí'}), clase='plainlist' }, {'Artistas relacionados', argumento'relacionados'}, {'Abreviatura en botánica', argumentoen botánica' or propiedad('P428')}, {'Abreviatura en zoología', argumentoen zoología' or propiedad('P835')}, {'Abreviatura en astronomía', argumentoen astronomía'}, --{, listaDesplegable(etiquetaInfluencias, argumentopor' or argumentopor' or -- argumento'influencias' or argumento'Influencias', frame)}, --{, listaDesplegable('Influyó a', argumentoen' or argumento'influyó' or argumento'Influyó', frame)}, -- Militares {'Rama militar', argumento'rama' or propiedad('P241', enMayusculas)}, {'Rango', argumento'rango' or propiedad('P410', conPeriodo), clase='plainlist'}, {'Participó en', argumento'conflictos' or argumento'batallas' or propiedad('P607', enMayusculas)}, -- Ajedrecistas {tipo='sección', {'Título', argumento'título' or argumento'titulo'}, -- {etiquetacampeon, argumento'campeón' or argumento'campeon'}, {'Elo', propiedad('P1087',{'formatoUnidad' = 'número', 'calificativo' = 'P585', 'linkback'='sí'}) or argumento'elo' }, -- {'Mejor elo', argumentoelo'}, {'Ránking', rankingajedrez}, {'Mejor ránking', argumentoranking'}, {'Término', argumento'término' or -- argumento'termino'}, {'Predecesor', argumento'predecesor'}, {'Sucesor', argumento'sucesor'}, }, {'Miembro de', argumentode' or propiedad('P463', conPeriodoDebeExistir), clase='plainlist'}, }, {tipo='sección', 'titulo' = 'Premios artísticos', -- Ver la ficha de noble o la ficha de diseñador estilotitulo = estilotitulo, {'Premios Óscar', argumentoóscar'}, {'Globos de Oro', argumentoglobo de oro'}, {'Premios BAFTA', argumentobafta'}, {'Premios Emmy', argumentoemmy'}, {'Premios SAG', argumentosag'}, {'Premios Tony', argumentotony'}, {'Premios Grammy', argumentogrammy'}, {'Festival de Cannes', argumentocannes'}, {'Berlinale', argumentoberlinale'}, {'Festival Internacional de San Sebastián', argumentosan sebastian'}, {'Festival Internacional de Cine de Moscú', argumentomoscu'}, {'Premios Goya', argumentogoya' }, {'Premios César', argumentocésar' or argumentocesar'}, {'Premios Ariel', argumentoariel'}, {'Premios Cóndor de Plata', argumentocóndor' or argumentocondor'}, {'Otros premios', argumentopremios'}, }, {tipo='sección', 'titulo' = 'Carrera deportiva', -- Ver la ficha de noble o la ficha de diseñador estilotitulo = estilotitulo, {'Deporte', argumento'deporte'}, }, {,seccionDesplegable('Títulos y reconocimientos',argumento'títulos', frame,estilotitulo)}, -- Los premios pueden ser para varias ocupaciones por lo que se ponen al final -- Premios, condecoraciones, medallas, distinciones, etc. {'Distinciones', argumento'premios' or argumento'Premios' or argumento'premio' or argumento'Premio' or argumento'premios2' or propiedad('P166', {'lista' = 'no ordenada', 'formatoTexto' = 'mayúscula', 'calificativo' = 'P585', ordenar='por fecha', mayor' = 'sí', eliminaranexo='sí',eliminar1=eliminarpremio,eliminar2=eliminarpremio2,eliminar3=eliminaroscar, eliminar4=eliminarsebastian, eliminar5=eliminartony,eliminar6=eliminarbafta, eliminar7=eliminarcanes, eliminar8=eliminargrammy,eliminar9=eliminaremmmy, 'linkback'='sí'}), clase ='plainlist'}, -- Mostrar las listas sin viñetas -- Con etiqueta/datos como en las fichas de escritor y artista en vez de como en la ficha de persona {'Firma', (firma and ('150px'))}, -- 150 px como en la ficha de escritor en vez de 128 {tipo='sección', -- Web clase ='plainlinks', titulo ='Web', estilotitulo = estilotitulo, {'Sitio web', noAlargar(enlazarURL(argumento'web' or argumentoweb' or argumento'website' or argumentoweb' or argumento'sitioweb') or propiedad('P856', {'valor-función' = formatoURL, 'linkback'='sí'}))}, {'Facebook', obtenerFacebook()}, -- Ver la plantilla facebook {'Twitter', obtenerTwitter()}, -- Ver la plantilla twitter }, {tipo='sección', titulo ='Notas', estilotitulo='border-top:1px solid #c0c0c0;text-align:left', {, argumento'notas', estilodatos='text-align:left;font-size:90%; line-height:1.2em'} }, --{'Fuente biográfica', argumento'fuentebiográfica'}, } categorias = {} if argumento'lugar_de_descanso' or --renombrado argumento'supervisora_doctoral' or --renombrado argumento'supervisores_doctorales' or --renombrado argumento'supervisor_doctoral' or --renombrado argumento'tesis_url' or --renombrado argumento'tesis_título' or --renombrado argumento'tesis_año' or --renombrado argumentoen astronomía' --or argumentoen' or argumento'influyó' or argumento'Influyó' -- eliminado --or argumento'predecesor' or argumento'sucesor'-- eliminado or argumento'fuentebiográfica' --por eliminar or argumento'mail' --por eliminar then table.insert(categorias, 'Categoría:Wikipedia:Páginas con parámetros a reemplazar de la plantilla ficha de persona ') end if nacimiento and not fallecimiento then table.insert(categorias, 'Categoría:Personas vivas') end if Entidad and Entidad.claims and Entidad.claims'P21' and not Entidad.claims'P21' nil then table.insert(categorias, categorizarWikidata( {'categoría' = { 6581097 = 'Hombres', 6581072 = 'Mujeres' } }, Entidad.claims'P21') ) end if categorias1 then return ModuloFicha.infobox(Ficha) .. table.concat(categorias) else return ModuloFicha.infobox(Ficha) end end function generarcargo(argumento,numero,frame) dato=numero --se requieren dos variables por el primer parámetro if numero 1 then numero ='' end --si es el primer cargo, entonces no tiene número if argumento 'cargo'..numero nil then titulo='' elseif argumento'escudo'..numero nil then titulo=argumento'cargo'..numero -- si no tiene escudo entonces dejar en blanco, si tiene escudo ponerlo else titulo='[[Archivo:'..argumento'escudo'..numero..'|44x40px]] '..argumento'cargo'..numero end if argumento'distrito'..numero then titulo = titulo..' por '..argumento'distrito'..numero..'' end if argumento'embajadorde'..numero then titulo = titulo .. frame:preprocess(' ') end-- }|tamaño=44x40px}} if argumento'país'..numero then titulo = titulo .. frame:preprocess(' ') end if argumento'subtítulo'..numero then titulo = titulo .. ' '..argumento'subtítulo'..numero..'' end periodo = '' if argumento'inicio'..numero and argumento'final'..numero then periodo = argumento'inicio'..numero..'-'.. argumento'final'..numero elseif argumento'final'..numero then periodo = 'Hasta el ' .. argumento'final'..numero elseif argumento'inicio'..numero then titulo = titulo .. ' Actualmente en el cargo' periodo = 'Desde el '..argumento'inicio'..numero end cadenatexto={tipo='sección', 'titulo'=titulo, estilotitulo = 'background-color:#E6E6FA;', {, periodo}, {'Vicegobernador', argumento'vicegobernador'..numero }, {'Presidente', argumento'presidente'..numero }, {'Monarca', argumento'monarca'..numero }, {'Primer ministro', argumento'primerministro'..numero }, {'Gobernador', argumento'gobernador'..numero }, {'Jefe de Gobierno', argumento'jefe'..numero}, {'Junto a', argumento'juntoa'..numero }, {'Nominado por', argumento'nominado'..numero }, {'Designado por', argumento'designado'..numero }, {'Gabinete', argumento'gabinete'..numero }, {'Vicepresidente', argumento'vicepresidente'..numero }, {'Viceprimerministro', argumento'viceprimerministro'..numero }, {'Teniente gobernador', argumento'teniente'..numero }, {'Vicealcalde', argumento'vicealcalde'..numero }, {'Vicejefe de gobierno', argumento'vicejefe'..numero}, {'Canciller', argumento'canciller'..numero}, {'Vicecanciller', argumento'vicecanciller'..numero}, {'Predecesor', argumento'predecesor'..numero}, {'Sucesor', argumento'sucesor'..numero}, {'Compañero de fórmula', argumento'fórmula'..numero}, {'Oponente/s', argumento'oponentes'..numero}, {'En el cargo', argumento'enelcargo'..numero }, {argumentodato..'data1', argumentodato..'data2' }, {argumentodato..'data3', argumentodato..'data4' }, {,' '} } return cadenatexto end -- Función que devuelve la lista de los valores de una propiedad en Wikidata formateados function propiedad(idPropiedad,opciones) -- No obtener ninguna propiedad de Wikidata para las personas fallecidas si se accede con el parámetro wikidata=no if not obtenerDatosWikidata then return end if Entidad and Entidad.claims and Entidad.claimsidPropiedad then if not opciones then opciones = {'linkback'='sí'} end opciones.entityId = Entidad.id --if idPropiedad 'P1477' then return require('Módulo:Tablas').tostring(Entidad) end -- FALTA opciones.propiedad = idPropiedad valorPropiedad = getPropiedadWikidata(opciones,Entidad.claimsidPropiedad) if not valorPropiedad then return end if valorPropiedad:match('%[%then algunaPropiedadEnlazaWikidata = true end return valorPropiedad end end function obtenerEtiquetaWikidata() if Entidad and Entidad.labels and Entidad.labels.es then return Entidad.labels.es.value end end function listaDesplegable(titulo, lista, frame) if not lista then return end formatoprevio='background:transparent' return frame:preprocess(' ') end function seccionDesplegable(titulo, lista, frame,estilotitulo) if not lista then return end return frame:preprocess(' ') end function estaEnlazado(que) -- De momento devolver siempre que está enlazado pues falla en por ejemplo: -- |Hijos = 6 if true then return que end if not que then return end for contenido in que:gmatch("%[%(.+)]") do if not contenido:match('^:d:') and not contenido:match('^Categoría:') then return que end end end function formatoOcupacionMasculino(valor, opciones, frame, calificativos) local enlaceOcupacion, etiquetaOcupacion, idEntidadOcupacion = ModuloWikidataFormatos.obtenerDatos(valor) return ModuloWikidataFormatos.enlazar(enlaceOcupacion, etiquetaOcupacion, idEntidadOcupacion, opciones) end function formatoOcupacionFemenino(valor, opciones, frame, calificativos) local enlaceOcupacion, etiquetaOcupacion, idEntidadOcupacion = ModuloWikidataFormatos.obtenerDatos(valor) -- Para las ocupaciones más frecuentes no se accederá a Wikidata local tablaOcupacionesFemeninas={ 'Q40348' = 'abogada', 'Q16631371' = 'académica', 'Q15253558' = 'activista', 'Q1476215' = 'activista por los derechos humanos', 'Q33999' = 'actriz', 'Q10800557' = 'actriz de cine', 'Q11481802' = 'actriz de doblaje', 'Q948329' = 'actriz de género', 'Q2259451' = 'actriz de teatro', 'Q10798782' = 'actriz de televisión', 'Q2405480' = 'actriz de voz', 'Q488111' = 'actriz pornográfica', 'Q10873124' = 'ajedrecista', 'Q4773904' = 'antropóloga', 'Q2478141' = 'aristócrata', 'Q42973' = 'arquitecta', 'Q483501' = 'artista', 'Q7019111' = 'asistenta social', 'Q11063' = 'astrónoma', 'Q18814623' = 'autobiógrafa', 'Q482980' = 'autora', 'Q5716684' = 'bailarina', 'Q805221' = 'bailarina de ballet', 'Q864503' = 'bióloga', 'Q8246794' = 'bloguera', 'Q177220' = 'cantante', 'Q2865819' = 'cantante de ópera', 'Q488205' = 'cantautora', 'Q1622272' = 'catedrática de universidad', 'Q901' = 'científica', 'Q15212951' = 'cineasta', 'Q1086863' = 'columnista', 'Q245068' = 'comediante', 'Q36834' = 'compositora', 'Q2722764' = 'conductora radiofónica', 'Q2490358' = 'coreógrafa', 'Q18939491' = 'diarista', 'Q193391' = 'diplomática', 'Q2526255' = 'directora de cine', 'Q5322166' = 'diseñadora', 'Q627325' = 'diseñadora gráfica', 'Q462390' = 'docente', 'Q214917' = 'dramaturga', 'Q188094' = 'economista', 'Q974144' = 'educadora', 'Q131524' = 'emprendedora', 'Q43845' = 'empresaria', 'Q186360' = 'enfermera', 'Q11774202' = 'ensayista', 'Q36180' = 'escritora', 'Q4853732' = 'escritora de literatura infantil', 'Q1281618' = 'escultora', 'Q11900058' = 'exploradora', 'Q13472585' = 'filántropa', 'Q4964182' = 'filósofa', 'Q169470' = 'física', 'Q33231' = 'fotógrafa', 'Q28389' = 'guionista', 'Q201788' = 'historiadora', 'Q715301' = 'historietista', 'Q82594' = 'informática teórica', 'Q16533' = 'jueza', 'Q185351' = 'jurista', 'Q644687' = 'ilustradora', 'Q14467526' = 'lingüista', 'Q1371925' = 'locutora', 'Q2251335' = 'maestra', 'Q191633' = 'mangaka', 'Q170790' = 'matemática', 'Q39631' = 'médica', 'Q4610556' = 'modelo', 'Q639669' = 'música', 'Q6625963' = 'novelista', 'Q1930187' = 'periodista', 'Q1028181' = 'pintora', 'Q728711' = 'playmate', 'Q49757' = 'poeta', 'Q82955' = 'política', 'Q270389' = 'presentadora de noticias', 'Q947873' = 'presentadora de televisión', 'Q3282637' = 'productora de cine', 'Q37226' = 'profesora', 'Q121594' = 'profesora', 'Q16145150' = 'profesora de música', 'Q212980' = 'psicóloga', 'Q3242115' = 'revolucionaria', 'Q3068305' = 'salonnière', 'Q622807' = 'seiyū', 'Q512314' = 'socialité', 'Q2306091' = 'socióloga', 'Q1141526' = 'stripper', 'Q1234713' = 'teóloga', 'Q333634' = 'traductora', 'Q350979' = 'zoóloga', } local etiquetaOcupacionCorregida = tablaOcupacionesFemeninasidEntidadOcupacion if etiquetaOcupacionCorregida then return ModuloWikidataFormatos.enlazar(enlaceOcupacion, etiquetaOcupacionCorregida, idEntidadOcupacion, opciones) else -- La ocupación no está en la tabla anterior. Se intenta obtener de la propiedad P2522 en Wikidata de la ocupación etiquetaOcupacionCorregida = ModuloWikidata.getPropiedadEnEspanyol(idEntidadOcupacion, 'P2521') or etiquetaOcupacion return ModuloWikidataFormatos.enlazar(enlaceOcupacion, etiquetaOcupacionCorregida, idEntidadOcupacion, opciones) .. 'Categoría:Wikipedia:Ocupaciones femeninas' end end function obtenerValorCalificativo(Propiedad, Calificativo, ValorPropiedad) -- Obtener el valor del primer calificativo de la propiedad con el valor recibido if not Entidad or not Entidad.claims or not Entidad.claimsPropiedad then return end for k,v in pairs(Entidad.claimsPropiedad) do if v.mainsnak and v.mainsnak.datavalue and v.mainsnak.datavalue.value and v.mainsnak.datavalue.value'numeric-id' ValorPropiedad and v.qualifiers and v.qualifiersCalificativo and v.qualifiersCalificativo1 and v.qualifiersCalificativo1.datavalue then return v.qualifiersCalificativo1.datavalue.value end end end function obtenerFacebook() local Facebook = argumento'facebook' or argumento'Facebook' if Facebook then return formatoFacebook(Facebook) end Facebook = propiedad('P2013', {'valor-función' = formatoFacebook, 'linkback'='sí'}) if Facebook then return Facebook end Facebook = obtenerValorCalificativo('P553' -- cuenta en red social , 'P554' --dirección en red social , 2013) -- Facebook if Facebook then return formatoFacebook(Facebook) end end function obtenerTwitter() local twitter = argumento'twitter' or argumento'Twitter' if twitter then return formatoTwitter(twitter) end twitter = propiedad('P2002', {'valor-función' = formatoTwitter, 'linkback'='sí'}) if twitter then return twitter end twitter = obtenerValorCalificativo('P553' -- cuenta en red social , 'P554' --dirección en red social , 2002) -- Twitter if twitter then return formatoTwitter(twitter) end end function obtenerArgumentosConValor(frame) local original if frame mw.getCurrentFrame() then original = frame:getParent().args else original = frame.args or frame end local copia= {} for k,v in pairs(original) do if v 'no' then --Si vale "no" dejar en blanco el argumento para no obtener el valor --de Wikidata copiak = '' elseif v~='' then --Si está en blanco dejarlo a nil para obtener en su caso el valor de -- Wikidata si no hay otro argumento con un nombre similar copiak = originalk end end return copia end function obtenerImagenWikidata() local imagen, valorImagen, piesDeImagen, k, pieDeImagen if not Entidad then return end -- Obtener la primera imagen en Wikidata de la persona local imagen = elementoTabla(Entidad, 'claims','P18',1) if not imagen then return end -- Obtener el nombre de la imagen valorImagen = elementoTabla(imagen, 'mainsnak','datavalue','value') -- Por ejemplo, imagen.jpg -- Obtener los pies de la imagen, uno por idioma piesDeImagen = elementoTabla(imagen, 'qualifiers','P2096') -- Encontrar el pie en español (aquel con datavalue.value.language = "es") if piesDeImagen then for k,pieDeImagen in pairs(piesDeImagen) do if pieDeImagen.datavalue.value.language 'es' then -- devolver la imagen y el texto del pie de la imagen en español return valorImagen, pieDeImagen.datavalue.value.text end end end -- Si no hay pie de imagen en español comprueba si hay fecha especificada para la imagen piesDeImagen = elementoTabla(imagen, 'qualifiers', 'P585') if piesDeImagen and piesDeImagen1 then return valorImagen, nombre .. ' en ' .. require('Módulo:Wikidata/Fecha').FormateaFechaHora(piesDeImagen1.datavalue.value, {'formatoFecha'='año','enlace'='no'}) end -- Sin pie de imagen en español return valorImagen end function obtenerFechaWikidata(propiedad) local declaracionesFecha = elementoTabla(Entidad, 'claims', propiedad) -- No devolver la edad si no hay ninguna o si hay varias fechas. if not declaracionesFecha or declaracionesFecha2 then return end local declaracionFecha = declaracionesFecha1 if not declaracionFecha then return end local valorFecha = elementoTabla(declaracionFecha, 'mainsnak', 'datavalue', 'value') if not valorFecha then return end --La precisión debe llegar hasta el día if valorFecha.precision ~= 11 then return end local iso = valorFecha.time if not iso then return end local fecha = {} fecha.calendario = valorFecha.calendarmodel fecha.anyo = tonumber(iso:sub(2, 5)) fecha.mes = tonumber(iso:sub(7,8)) fecha.dia = tonumber(iso:sub(10,11)) return fecha end function obtenerEdadWikidata(fallecido) local fechaNacimiento = obtenerFechaWikidata('P569') if not fechaNacimiento then return end if fallecido then local fechaFallecimiento = obtenerFechaWikidata('P570') if fechaFallecimiento and fechaFallecimiento.calendario fechaNacimiento.calendario then return edad(fechaNacimiento, fechaFallecimiento) end else return edad(fechaNacimiento) end end function noAlargar(que) if not que then return end return ' ' .. que .. ' ' end return z